package parser

import (
	"parse/src/interpreter"
)

// 解析结果
type ParseResult struct {
	Error_                     *interpreter.Error // 错误
	Node                       interface{}        // 节点
	LastRegisteredAdvanceCount int                // 最后一次注册的 的
	AdvanceCount               int                // 往前走的步数
	ToReverseCount             int                // 往后走的步数
}

// 实例化
func NewParseResult() *ParseResult {
	pr := &ParseResult{
		Error_:                     nil,
		Node:                       nil,
		LastRegisteredAdvanceCount: 0,
		AdvanceCount:               0,
		ToReverseCount:             0,
	}
	return pr
}

// 注册器 向前走一步
func (p *ParseResult) RegisterAdvancement() {
	p.LastRegisteredAdvanceCount = 1
	p.AdvanceCount++
}

// 注册器,返回的是 节点
func (p *ParseResult) Register(res *ParseResult) interface{} {
	p.LastRegisteredAdvanceCount = res.AdvanceCount
	p.AdvanceCount += res.AdvanceCount
	if res.Error_ != nil {
		p.Error_ = res.Error_
	}
	return res.Node
}

// 尝试注册,返回的是任意类型
func (p *ParseResult) TryRegister(res *ParseResult) interface{} {
	if res.Error_ != nil {
		p.ToReverseCount = res.AdvanceCount
		// 返回为空的节点，表示为有错误
		return p.Register(res)
	}
	return p.Register(res)
}

// 注册成功 ，必须是任意类型
func (p *ParseResult) Success(node interface{}) *ParseResult {
	p.Node = node
	return p
}

// 注册失败
func (p *ParseResult) Failure(err *interpreter.Error) *ParseResult {
	if err != nil {
		// 表示有错误
		p.Error_ = err
	}
	return p
}
